﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Sistema_financiero
{
    public partial class frm_Actualizar_punitorios : Form
    {
        public List<Entidades.Prestamo> Lista_prestamos = new List<Sistema_financiero.Entidades.Prestamo>();
        public List<Entidades.Cuota> Lista_cuotas = new List<Sistema_financiero.Entidades.Cuota>();
        public List<Entidades.Pago> Lista_pagos = new List<Sistema_financiero.Entidades.Pago>();
        public frm_Actualizar_punitorios()
        {
            InitializeComponent(); Lista_prestamos = Entidades.Prestamo.Obtener_Todos_Prestamos_Pendientes();
            Actualizar_estado_prestamo();
            Actualizar_punitorios();
            this.Close();

        }

        private void frm_Actualizar_punitorios_Load(object sender, EventArgs e)
        {
            

        }

        public void Actualizar_estado_prestamo() // lo hace con los prestamos del dia anterior
        {
            bool permite_cancelar_pago;
            permite_cancelar_pago = true;
            decimal pago;
            pago = 0;
            decimal total_cuotas;
            total_cuotas = 0;
            Progress_Bar.Value = 0;
            foreach (Entidades.Prestamo P in Lista_prestamos)
            {
                Progress_Bar.Value = Progress_Bar.Value + (Lista_prestamos.Count / 100);
                Lista_cuotas = Entidades.Cuota.Obtener_Cuotas(P.ID);
                Lista_pagos = Entidades.Pago.Obtener_pagos(P.ID);

                foreach (Entidades.Pago Pa in Lista_pagos)
                {
                    pago = pago + Pa.Valor;
                    if (Pa.Fecha.Date >= DateTime.Now.Date)
                    {
                        permite_cancelar_pago = false;
                        break;
                    }

                }
                if (permite_cancelar_pago == true)
                {
                    foreach (Entidades.Cuota C in Lista_cuotas)
                    {
                        total_cuotas = total_cuotas + C.Total;
                    }
                    if (pago == total_cuotas) //se comprueba si fue pagado en su totalidad
                    {
                        Entidades.Prestamo.Actualizar_estado_prestamo(P.ID, P.ID_estado_prestamo);
                    }
                }
                
            }
        }

        public void Actualizar_punitorios()
        {
            decimal pago;
            pago = 0;
            decimal total_cuotas;
            total_cuotas = 0;
            Progress_Bar.Value = 0;
            int cuota;
            int dias_vencidos;
            bool cuota_ultima_pagada;
            decimal pagado;
            decimal falta_pagar;
            foreach (Entidades.Prestamo P in Lista_prestamos)
            {
                pagado = 0;
                falta_pagar = -1;
                
                Progress_Bar.Value = Progress_Bar.Value + (Lista_prestamos.Count / 100);
                Lista_cuotas = Entidades.Cuota.Obtener_Cuotas(P.ID);
                Lista_pagos = Entidades.Pago.Obtener_pagos(P.ID);
                
                foreach (Entidades.Pago Pa in Lista_pagos)
                {
                    pago = pago + Pa.Valor;

                }
                
                cuota = 1;
                //cuota_ultima_pagada = false;
                total_cuotas = Lista_cuotas[0].Total;
                foreach (Entidades.Cuota C in Lista_cuotas)
                {
                    dias_vencidos = 0;
                    cuota_ultima_pagada = false;
                    if (pago >= total_cuotas)
                    {
                        total_cuotas = total_cuotas + C.Total;
                    }
                    else
                    {
                        if ((C.Fecha_vencimiento.Date < DateTime.Now.Date) && (P.Fecha_act_punitorio.Date < DateTime.Now.Date))//Cuota vencida
                        {
                            if (C.Fecha_vencimiento < P.Fecha_act_punitorio)
                            {
                                dias_vencidos = (DateTime.Now.Date - P.Fecha_act_punitorio.Date).Days;
                            }
                            else
                            {
                                dias_vencidos = (DateTime.Now.Date - C.Fecha_vencimiento.Date).Days;
                            }
                            if (falta_pagar == -1)
                            {
                                falta_pagar = (total_cuotas + C.Punitorios + C.Punitorios_adic) - pago;
                                C.Punitorios = C.Punitorios + (falta_pagar * P.Tasa_punitorio * dias_vencidos);
                            }
                            else
                            {
                                C.Punitorios = C.Punitorios + (C.Total * P.Tasa_punitorio * dias_vencidos);
                            }
                            Entidades.Cuota.Actualizar_punitorio_cuota(P.ID, C.Num_cuota, C.Punitorios, C.Punitorios_adic);
                        }
                        
                    }
                    
                    C.Total = C.Capital + C.Comision + C.Gastos + C.Intereses + C.Iva + C.Punitorios + C.Punitorios_adic;
                    cuota = cuota + 1;
                }
                Entidades.Prestamo.Actualizar_punitorios_prestamo(P.ID, DateTime.Now);

            }
            
        }
    }
}
